/**
  ******************************************************************************
  * @file    eeprom_emulation.h
  * @author  ashuai0110
  * @version V2.4
  * @date    2024-09-25
  * @brief   FLASH模拟EEPROM
  *          (变长存储,磨损均衡,多页管理,掉电安全)
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __EEPROM_EMULATION_H
#define __EEPROM_EMULATION_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common_include.h"

/**
 * @addtogroup modules
 * @{
 */

/**
 * @addtogroup eeprom_emulation
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup eeprom_emulation_global_types eeprom emulation global types
 * @{
 */

/**
  * @brief  读/写flash
  *
  * @param  startAddr : 起始地址
  *
  * @param  pBuf      : 数据缓冲区
  *
  * @param  len       : 读/写数量byte
  *
  * @retval 0:读/写成功  1:读/写失败
  */
typedef uint8_t (* ee_flash_rw_fn_t)(uint32_t startAddr, void *data, uint32_t len);

/**
  * @brief  擦除flash
  *
  * @param  startAddr : 起始地址
  *
  * @param  bytes     : 擦除总字节数量
  *
  * @retval 0:擦除成功  1:擦除失败
  */
typedef uint8_t (* ee_flash_erase_fn_t)(uint32_t startAddr, uint32_t bytes);

/**
  * @brief  模拟EEPROM structure definition
  */
typedef struct eeprom_em {
    uint32_t transferAddr;  /*!< 数据迁移地址temp */
    uint32_t page1AddrS;    /*!< 管理页1起始地址 */
    uint32_t page2AddrS;    /*!< 管理页2起始地址 */
    uint16_t pageSize;      /*!< FLASH单页大小byte */
    uint16_t virtAddrTotal; /*!< 已使用的虚拟地址数量 */
    uint8_t pageTotal;      /*!< 管理页1或管理页2管理的总页数 */
    uint8_t onceWrSize;     /*!< FLASH单次写入字节byte(可取1,2,4) */

    ee_flash_erase_fn_t flashEraseFn; /*!< 擦除FLASH接口 */
    ee_flash_rw_fn_t flashReadFn;     /*!< 读取FLASH接口 */
    ee_flash_rw_fn_t flashWriteFn;    /*!< 写入FLASH接口 */
} eeprom_em_t;

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup eeprom_emulation_global_functions
 * @{
 */

uint8_t eeprom_em_init(eeprom_em_t *_ee, uint32_t page1AddrS, uint32_t page2AddrS, uint16_t pageSize, uint8_t onceWrSize, uint8_t pageTotal, \
    uint16_t virtAddrTotal, ee_flash_erase_fn_t flashErase, ee_flash_rw_fn_t flashRead, ee_flash_rw_fn_t flashWrite);
void eeprom_em_deinit(eeprom_em_t *_ee);

uint8_t eeprom_em_write(eeprom_em_t *_ee, uint16_t virtAddr, void *data, uint8_t len);
uint8_t eeprom_em_read(eeprom_em_t *_ee, uint16_t virtAddr, void *data, uint8_t len);

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* eeprom_emulation.h */
